#!/usr/local/bin/python
# -*- coding: utf-8 -*-

'''
    道具管理对象定义
'''

import logging, traceback
from tornado.escape import json_encode,json_decode
import time

import log
import util
import const, code_define
import mysqlHelper
  

logger = logging.getLogger(__name__)


class PropManager(util.SingleClass):
    '''道具管理器'''

#----------------------------------
#    #/*pack(背包类)(买了放背包, 需点使用)(一次性)*/
#    'wine'          #'酒水'            #'背包类, 勇气+'); 
#    'compote'       #'果盘'            #'背包类, 人品+'); 
#    'goldcar'       #'金币卡'          #'背包类, 金币+'); 
#    'energycard'    #'人缘卡',         #'背包类, 人缘+');

#    'brooch'        #'胸花'            #'背包类, 酒吧大厅T台票'); 
#    'king'          #'后冠'            #'背包类, 独霸名人堂页面'); 

#    'loupe'         #'放大镜'          #'背包类, 搭讪前可查看对方照片'); 

#    'photoscope'    #'透视镜'          #'背包类, 显示对方虚拟形象时，是裸体的');
#    'horn'          #'大喇叭'          #'背包类, 使用大喇叭，所有人能看到我的发言;(一次性, 不保存到"我正在使用"列表)
#    'seeklove '     #'求爱道具'        #'背包类, 求爱气球等
     
#    'popo'          #'泡泡'            #'背包类, 聊天泡泡'); 
#----------------------------------    
#    #/*attire (装饰类)(可穿戴, 可续费)*/
#    'sinensis'      #'大红花'          #'装饰类, 人缘+，每次移植(穿戴)须付费, (过期不续费, 隐藏超出人缘数的好友)'); 
#    'halo'          #'光环'            #'装饰类, 跟我聊天的人，可得额外经验、金币、魅力加成'); 
#    'cheeky'        #'厚脸皮'          #'装饰类, 插足后防止提前被踢'); 
#    'stealth'       #'隐形符'          #'装饰类, 防止被插足'); 
#----------------------------------    
#    #/*bar(酒吧类)(现买现用)(一次性)*/
#    'bomb'          #'深水炸弹'        #'酒吧类, (深水炸弹&大棒&大便)把对方服装炸掉，并强制驱离约会现场');
#    'nobother'      #'防打扰牌'        #'酒吧类, 挂上防打扰牌，任何人不得插足、干扰'); 
#    'specially'     #'约会特效'        #'酒吧类, 绚烂的爱、气球广告、首页霓虹灯真爱宣言、小提琴伴奏、烛光晚餐'); 
#    'magic'         #'魔法卡片'        #'酒吧类, 把对方变成侏儒、猪头、鬼魂等变态形象， 魔咒时间自定'); 
#----------------------------------

    #---------pack(背包类)----    
    def isUsingPropBrooch(self, tmpUser):
        '''获取正在使用的道具:胸花'''   
        import bar_order 
        return bar_order.BarOrderManager.instance().isInTUserList(tmpUser)
        #return self._ifMyUsingPropsOutTime(tmpUser, "brooch") #胸花不在"我的正在使用道具"队列

    def isUsingPropKing(self, tmpUser):
        '''获取正在使用的道具:后冠'''      
        return self._ifMyUsingPropsOutTime(tmpUser, "king")
    
    def isUsingPropLoupe(self, tmpUser):
        '''获取正在使用的道具:放大镜'''      
        return self._ifMyUsingPropsOutTime(tmpUser, "loupe")
    
    #---------attire (装饰类)----
    def getSinensisEnergy(self, tmpUser):
        '''获取正在使用的道具:大红花  增加的人缘(精力)'''      
        tmpGoodsObj = self._ifMyUsingPropsOutTime(tmpUser, "sinensis")
        if not tmpGoodsObj:
            return 0                
        return tmpGoodsObj.get("energy")
    
    def isUsingPropsHalo(self, tmpUser):
        '''获取正在使用的道具:光环'''      
        return self._ifMyUsingPropsOutTime(tmpUser, "halo")
    
    def isUsingPropsCheeky(self, tmpUser):
        '''获取正在使用的道具:厚脸皮'''      
        return self._ifMyUsingPropsOutTime(tmpUser, "cheeky")

    def isUsingPropsStealth(self, tmpUser):
        '''获取正在使用的道具:隐形符'''      
        return self._ifMyUsingPropsOutTime(tmpUser, "stealth")

    def _ifMyUsingPropsOutTime(self, tmpUser, type3):
        '''获取正在使用type3的道具(同时只能用一个type3类型的道具)'''
        if not tmpUser:
            return 0
        
        tmpMyUsingProps = tmpUser.getMyUsingProps()#我正在使用的道具
        if not tmpMyUsingProps:
            return 0        
        tmpInfo = tmpMyUsingProps.get(type3)
        if not tmpInfo:
            return 0        
        tmpProps = tmpInfo.get("props")
        if not tmpProps:
            return 0
        tmpEndTime = tmpProps.get("limit_time")  #使用结束时间(秒)
        if time.time() > tmpEndTime:             #超时
            tmpMyUsingProps.pop(type3)           #超时则删除
            self.updateUsingPropsToDB(tmpUser)   #更新到DB
            return 0
        
        tmpGoodsID = tmpProps.get('goods_id')   #获取商品道具ID
        if not tmpGoodsID:
            return 0    
         
        from store import store
        return store.get_goods_info(tmpGoodsID) #从全局商品表 获取道具信息

    
    def delMyUsingPropsForOutTime(self, tmpUser):
        '''删除过期的"正在使用"的道具, 然后保存到DB'''
        if tmpUser:
            tmpCurrTime = time.time() #当前时间
            tmpMyUsingProps = tmpUser.getMyUsingProps()
            for type3, propsObj in tmpMyUsingProps.items():
                tmpProps = propsObj.get("props")
                if tmpProps:
                    if tmpCurrTime > tmpProps.get("limit_time"): #过期, 删除
                        tmpMyUsingProps.pop(type3)
            tmpUser.setUserInfoPropMagic()      #把正在使用的magic道具保存到另外一个字段
            self.updateUsingPropsToDB(tmpUser)  #更新到DB

    def updateUsingPropsToDB(self, tmpUser):
        '''更新"当前使用的"道具到DB'''
        if tmpUser:
            tmpProps = tmpUser.getMyUsingProps()
            strProps = json_encode(tmpProps)            
            uid = tmpUser.getUID()
            socket_id = tmpUser.getSocketID()
            log.print_debug(logger, "PropManager updateUsingPropsToDB exec[0], uid:[%s], socketid[%s], usingProps:\n%s" %(uid, socket_id, strProps))
            
            conn = mysqlHelper.mysql()      
            conn.upData('t_user_data', {"my_props_using": strProps}, "WHERE uid = %d" % uid)

            log.print_debug(logger, "PropManager updateUsingPropsToDB exec[1], uid:[%s], socketid[%s], usingProps:\n%s" %(uid, socket_id, strProps))
 
       
       
    #-------我购买的道具--------------   
    def updateMyPropsToDB(self, tmpUser):
        '''更新"我已购买"的道具到DB'''
        if tmpUser:
            tmpProps = tmpUser.getMyProps()
            strProps = json_encode(tmpProps)            
            uid = tmpUser.getUID()
            log.print_debug(logger, "PropManager updateMyPropsToDB exec, uid:[%s], myProps:\n%s" %(uid, strProps))
            
            conn = mysqlHelper.mysql()      
            conn.upData('t_user_data', {"my_props": strProps}, "WHERE uid = %d" % uid)
    
    def _getMyPropsByType3(self, tmpUser, type2, type3):
        '''获取"我已购买"的某type3类型道具'''
        if tmpUser is None:
            return None
        tmpMyProps = tmpUser.getMyProps()   #"我已购买"的道具
        tmpMyPropsType2 = tmpMyProps.get(type2)
        if not tmpMyPropsType2:
            return None
        tmpMyPropsType3 = tmpMyPropsType2.get(type3)
        if not tmpMyPropsType3:
            return None                    
        tmpObjInfoList = tmpMyPropsType3.get("info")
        if tmpObjInfoList:
            return tmpObjInfoList       
        return None
    
    def _decreaseOneMyProps(self, tmpUser, type2, type3, tmpGoodsID):
        '''从“我购买的道具”列表删除一个道具'''
        tmpObjInfoList = self._getMyPropsByType3(tmpUser, type2, type3)
        if tmpObjInfoList:
             for obj in tmpObjInfoList:
                if tmpGoodsID == obj.get("id"): 
                    if obj.get("nums") > 0: #数量减1
                        obj["nums"] -= 1
                    if obj.get("nums") <= 0:
                        tmpObjInfoList.remove(obj)
                    return
    
    def getOneMyProps(self, tmpUser, type2, type3, tmpGoodsID):
        '''获取"我已购买"的某个道具'''                    
        tmpObjInfoList = self._getMyPropsByType3(tmpUser, type2, type3)
        if tmpObjInfoList:
            for obj in tmpObjInfoList:
                if tmpGoodsID == obj.get("id") and obj.get("nums") > 0:
                    obj["type_3"] = type3
                    return obj
        return None
    
    def getOneMyPropsExt(self, tmpUser, tmpGoodsID):
        '''获取"我已购买"的某个道具, 根据商品 ID'''
        if not tmpUser:
            return None
        
        from store import *
        tmpGoodsObj = store.get_goods_info(tmpGoodsID)
        if not tmpGoodsObj:
            return None
        
        type1 = tmpGoodsObj.get("type_1")
        if type1 and type1 not in ["props"]:
            return None
        
        type2 = tmpGoodsObj.get("type_2")
        type3 = tmpGoodsObj.get("type_3")
        return self.getOneMyProps(tmpUser, type2, type3, tmpGoodsID)
        
    
    def decreaseMyPropsAndUpdateToDB(self, tmpUser, type2, type3, tmpGoodsID):
        '''删除"我购买"的某个道具,并更新DB'''
        self._decreaseOneMyProps(tmpUser, type2, type3, tmpGoodsID) #从“我购买的道具”列表删除一个道具
        self.updateMyPropsToDB(tmpUser)#然后保存到DB    
    
    